package ihm;

import controller.AscenseurControleur;
import controller.EtageControleur;
import controller.SimulationControleur;
import controller.algorithme.Algorithme;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import model.Date;

/**
 * Classe qui affiche, dans la partie gauche de la fenêtre, le panel nommé "Pilotage manuel de la batterie".
 * 
 * @author Jason
 */
public class PanelPilotageManuel extends JPanel {

	private static final long serialVersionUID = 1L;
	
	private final String ALGORITHME = "Algorithme : ";
	private final String TRAJET_PLUS_COURT = "Trajet le plus court";
	private final String ECONOMIE_ENERGIE = "Economie d'énergie";
	private final String AUTOMATIQUE = "Automatique";
	private final String PILOTAGE_MANUEL_BATTERIE = "Pilotage manuel de la batterie";
	private final String ETAGE_DEPART = "Etage de départ";
	private final String ETAGE_ARRIVEE = "Etage d'arrivée";
	private final String ASCENSEUR = "Ascenseur";
	private final String APPEL_UN = "Appel 1";
	private final String APPEL_DEUX = "Appel 2";
	private final String APPEL_TROIS = "Appel 3";
	
	private Font policeTitres = new Font("Dialog",Font.BOLD,14);
	
	private JLabel lblAlgorithme;
	private JLabel lblPilotageManuel;
	private JLabel lblEtageDepart;
	private JLabel lblEtageArrivee;
	private JLabel lblAscenseur;

	private JRadioButton rbPilotManuTrajetPlusCourt;
	private JRadioButton rbPilotManuEconomieEnergie;
	private JRadioButton rbPilotManuAutomatique;
	
	private JTextField tfEtageDepart1;
	private JTextField tfEtageDepart2;
	private JTextField tfEtageDepart3;
	private JTextField tfEtageArrivee1;
	private JTextField tfEtageArrivee2;
	private JTextField tfEtageArrivee3;
	private JTextField tfAscenseur1;
	private JTextField tfAscenseur2;
	private JTextField tfAscenseur3;
	
	private JButton btnAppel1;
	private JButton btnAppel2;
	private JButton btnAppel3;
	private SimulationControleur simulationControleur;
        private AscenseurControleur ascenseurControleur;
        private EtageControleur etageControleur;
        private Integer algoChoisi;
	private JPanel panelSaisies;
	
	/**
	 * Constructeur.
	 */
	public PanelPilotageManuel(SimulationControleur simulationControleur,AscenseurControleur ascenseurControleur, EtageControleur etageControleur) {
            this.simulationControleur = simulationControleur;
            this.etageControleur = etageControleur;
            this.ascenseurControleur = ascenseurControleur;
            this.algoChoisi = null;
            
            lblPilotageManuel = new JLabel(PILOTAGE_MANUEL_BATTERIE);
            lblPilotageManuel.setFont(policeTitres);

            lblAlgorithme = new JLabel(ALGORITHME);

            lblEtageDepart = new JLabel(ETAGE_DEPART);
            lblEtageArrivee = new JLabel(ETAGE_ARRIVEE);
            lblAscenseur = new JLabel(ASCENSEUR);

            rbPilotManuTrajetPlusCourt = new JRadioButton(TRAJET_PLUS_COURT);
            rbPilotManuEconomieEnergie = new JRadioButton(ECONOMIE_ENERGIE);
            rbPilotManuAutomatique = new JRadioButton(AUTOMATIQUE);

            tfEtageDepart1 = new JTextField();
            tfEtageDepart2 = new JTextField();
            tfEtageDepart3 = new JTextField();
            tfEtageArrivee1 = new JTextField();
            tfEtageArrivee2 = new JTextField();
            tfEtageArrivee3 = new JTextField();
            tfAscenseur1 = new JTextField();
            tfAscenseur2 = new JTextField();
            tfAscenseur3 = new JTextField();

            btnAppel1 = new JButton(APPEL_UN);
            btnAppel2 = new JButton(APPEL_DEUX);
            btnAppel3 = new JButton(APPEL_TROIS);

            //Construction du groupe de radioButtons.
            ButtonGroup groupPilotManu = new ButtonGroup();
	    groupPilotManu.add(rbPilotManuTrajetPlusCourt);
	    groupPilotManu.add(rbPilotManuEconomieEnergie);
	    groupPilotManu.add(rbPilotManuAutomatique);
	    
	    this.creerMarges();
	    this.creerPanelSaisies();
	    this.definirLayout();
            this.ajouterEvenementsBouton();
	}
	
	/**
	 * Créé les marges qui permettent de créer un espace autour du contenu du JPanel.
	 */
	private void creerMarges() {
	    this.setBorder(
				BorderFactory.createEmptyBorder(
						20,20,20,20
				)
		);
	}
	
	/**
	 * Construit le panel contenant les zones de saisies des appels manuels.
	 */
	private void creerPanelSaisies() {
	    GridBagLayout gbl = new GridBagLayout();
	    GridBagConstraints gbc = new GridBagConstraints();
	    panelSaisies = new JPanel();
	    
	    //gridx : gestion des colonnes.
	    //gridy : gestion des lignes.
	    panelSaisies.setLayout(gbl);
	    
	    gbc.gridx = 0;
	    gbc.gridy = 0;
	    gbc.ipadx = 20;
	    panelSaisies.add(lblEtageDepart, gbc);
	    gbc.gridx = 1;
	    gbc.gridy = 0;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfEtageDepart1, gbc);
	    gbc.gridx = 2;
	    gbc.gridy = 0;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfEtageDepart2, gbc);
	    gbc.gridx = 3;
	    gbc.gridy = 0;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfEtageDepart3, gbc);
	    
	    gbc.gridx = 0;
	    gbc.gridy = 1;
	    gbc.ipadx = 20;
	    panelSaisies.add(lblEtageArrivee, gbc);
	    gbc.gridx = 1;
	    gbc.gridy = 1;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfEtageArrivee1, gbc);
	    gbc.gridx = 2;
	    gbc.gridy = 1;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfEtageArrivee2, gbc);
	    gbc.gridx = 3;
	    gbc.gridy = 1;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfEtageArrivee3, gbc);
	    
	    gbc.gridx = 0;
	    gbc.gridy = 2;
	    gbc.ipadx = 20;
	    panelSaisies.add(lblAscenseur, gbc);
	    gbc.gridx = 1;
	    gbc.gridy = 2;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfAscenseur1, gbc);
	    gbc.gridx = 2;
	    gbc.gridy = 2;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfAscenseur2, gbc);
	    gbc.gridx = 3;
	    gbc.gridy = 2;
	    gbc.ipadx = 70;
	    panelSaisies.add(tfAscenseur3, gbc);
	    
	    gbc.gridx = 1;
	    gbc.gridy = 3;
	    gbc.ipadx = 0;
	    panelSaisies.add(btnAppel1, gbc);
	    gbc.gridx = 2;
	    gbc.gridy = 3;
	    gbc.ipadx = 0;
	    panelSaisies.add(btnAppel2, gbc);
	    gbc.gridx = 3;
	    gbc.gridy = 3;
	    gbc.ipadx = 0;
	    panelSaisies.add(btnAppel3, gbc);
	}
	
	/**
	 * Met en forme le panel.
	 */
	private void definirLayout() {
		GroupLayout layout = new GroupLayout(this);
		this.setLayout(layout);
		
		layout.setHorizontalGroup(
			layout.createParallelGroup(GroupLayout.Alignment.CENTER)
					.addComponent(lblPilotageManuel)
					.addComponent(lblAlgorithme)
				.addGroup(layout.createSequentialGroup()
					.addComponent(rbPilotManuTrajetPlusCourt)
					.addComponent(rbPilotManuEconomieEnergie)
					.addComponent(rbPilotManuAutomatique)
				)
					.addComponent(panelSaisies)
		);
		
 		layout.setVerticalGroup(
            layout.createSequentialGroup()
					.addComponent(lblPilotageManuel)
					.addComponent(lblAlgorithme)
				.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
					.addComponent(rbPilotManuTrajetPlusCourt)
					.addComponent(rbPilotManuEconomieEnergie)
					.addComponent(rbPilotManuAutomatique)
				)
					.addComponent(panelSaisies)
 		);
	}

    private void ajouterEvenementsBouton() {
        rbPilotManuAutomatique.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                algoChoisi = Algorithme.MODE_AUTOMATIQUE;
            }
        });
        rbPilotManuEconomieEnergie.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                algoChoisi = Algorithme.ECONOMIE_ENERGIE;
            }
        });
        rbPilotManuTrajetPlusCourt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                algoChoisi = Algorithme.LE_PLUS_COURT;
            }
        });
        
        btnAppel1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    if(simulationControleur.isSimuEnCours()) {
                        simulationControleur.ajouterAppelManuelAscenseur(
                                ascenseurControleur.getAscenseur(Integer.valueOf(tfAscenseur1.getText())), 
                                etageControleur.getEtageByNumero(Integer.valueOf(tfEtageDepart1.getText())), 
                                etageControleur.getEtageByNumero(Integer.valueOf(tfEtageArrivee1.getText())), 
                                new Date(simulationControleur.getHeure(), simulationControleur.getMinute(), simulationControleur.getSeconde()),
                                algoChoisi
                        );
                    } else {
                        JOptionPane.showMessageDialog(null, "L'appel ne peut pas être effectué car la simulation n'est pas lancée", "Erreur", JOptionPane.ERROR_MESSAGE);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(PanelPilotageManuel.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null, ex.getMessage(), "Appel invalide", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        
        btnAppel2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    if(simulationControleur.isSimuEnCours()) {
                        simulationControleur.ajouterAppelManuelAscenseur(
                                ascenseurControleur.getAscenseur(Integer.valueOf(tfAscenseur2.getText())), 
                                etageControleur.getEtageByNumero(Integer.valueOf(tfEtageDepart2.getText())), 
                                etageControleur.getEtageByNumero(Integer.valueOf(tfEtageArrivee2.getText())), 
                                new Date(simulationControleur.getHeure(), simulationControleur.getMinute(), simulationControleur.getSeconde()),
                                algoChoisi
                        );
                    } else {
                        JOptionPane.showMessageDialog(null, "L'appel ne peut pas être effectué car la simulation n'est pas lancée", "Erreur", JOptionPane.ERROR_MESSAGE);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(PanelPilotageManuel.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null, ex.getMessage(), "Appel invalide", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        
        btnAppel3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    if(simulationControleur.isSimuEnCours()) {
                        simulationControleur.ajouterAppelManuelAscenseur(
                                ascenseurControleur.getAscenseur(Integer.valueOf(tfAscenseur3.getText())), 
                                etageControleur.getEtageByNumero(Integer.valueOf(tfEtageDepart3.getText())), 
                                etageControleur.getEtageByNumero(Integer.valueOf(tfEtageArrivee3.getText())), 
                                new Date(simulationControleur.getHeure(), simulationControleur.getMinute(), simulationControleur.getSeconde()),
                                algoChoisi
                        );
                    } else {
                        JOptionPane.showMessageDialog(null, "L'appel ne peut pas être effectué car la simulation n'est pas lancée", "Erreur", JOptionPane.ERROR_MESSAGE);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(PanelPilotageManuel.class.getName()).log(Level.SEVERE, null, ex);
                    JOptionPane.showMessageDialog(null, ex.getMessage(), "Appel invalide", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }
}
